<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 实现一个 flatten 函数，实现如下的转换功能
        const objInput = {
            a: 1,
            b: [1, 2, { c: true }],
            c: { e: 2, f: 3 },
            g: null,
        };
        // 转化为扁平化之后的对象
        let objRes = {
            a: 1,
            "b[0]": 1,
            "b[1]": 2,
            "b[2].c": true,
            "c.e": 2,
            "c.f": 3,
            g: null,
        };
        // 目标就是对result进行构造
        // 递归函数的结束条件：入参value非对象/数组，直接根据累计的key（path）对result进行构造即可
        // path记录处理value之前已经累计的路径（key）
        const flattern = (obj) => {
            const result = {};
            const dfs = (value, path) => {
                if(typeof value !== 'object') {
                    console.log(path, value);
                    result[path] = value;
                    return;
                }
                let isArray = Array.isArray(value);
                if(value === null) {
                    return;
                } else if(isArray) {
                    for(let i = 0; i < value.length; i ++) {
                        let newKey = `${path}[${i}]`;
                        dfs(value[i], newKey);
                    }
                } else {
                    for(let key of Object.keys(value)) {
                        let newKey = path === '' ? key : `${path}.${key}`;
                        dfs(value[key], newKey);
                    }
                }
            }
            dfs(obj, '');
            return result;
        }
        const obj = {
            a: 1,
            b: [1, 2, { c: true }],
            c: { e: 2, f: 3 },
            g: null,
        };
        console.log(flattern(obj));
    </script>
</body>
</html>